#ifndef SCHEDULER_H
#define SCHEDULER_H

#include "paging.h"

// Prioritäten
#define PRIORITY_HIGH 3
#define PRIORITY_NORMAL 2
#define PRIORITY_LOW 1

#define MAX_TIMERS 256
#define MAX_THREADS 64
#define STACK_SIZE 4*1024
// 5MS zwischen aufrufe
#define INTERVAL_TIME 5

// Task Flags
#define TASK_FLAG_WAKEUP_PARENT 1	// Soll der Elternprozess aufgeweckt werden?

// Timer Struktur.
struct TMR_Eintrag {
	char active;		// Timer aktiv?
	int interval;		// Zeit (MS) zwischen aufrufen
	int elapsed;		// Vergangene Zeit seit dem letzten Funktions aufruf
	int (*function)();	// Pointer auf eine Funktion
};

/* Wird von IRQ0 aufgerufen. (siehe idt_behandlung in header/idt.c)
 * Parameter: Keine
 * Rückgaben: Keine
 */
struct stack_frame* irq_schedule (struct stack_frame *);

/* Setzt current_task auf den nächsten Task
 */
void inline next_task ();

/* Wartet eine gewisse Zeispanne - Kleinste mögliche Zeit = INTERVAL_TIME
 * Parameter: Zeit in MS
 * Rückgaben: Keine
 */
void sleep (uint32_t);

/* Initialisiert Multi-Threading
 * Parameter: Keine
 * Rückgaben: Keine
 */
void mt_init ();

/* Erstellt einen neuen Task
 * Parameter:
 * Rückgaben: Thread ID
 */
struct task *mt_createThread (void *, BOOL);

/* Hält einen Task an
 * Parameter: PID
 * Rückgaben: Returnwert, falls ein FreezeTask durch »system« aufgerufen wird
 */
int FreezeTask (pid_t);

/* Setzt einen angehaltenen Task fort
 * Parameter: PID
 * Rückgaben: Keine
 */
void ResumeTask (pid_t);

/* Gibt die PID des aktuell laufenden Tasks zurück
 * Parameter: Keine
 * Rückgaben: PID
 */
pid_t GetRunningTaskPID ();

/* Liefert einen Task struct zu einer PID zurück
 * Parameter: PID
 * Rückgaben: task Pointer
 */
struct task *GetTaskStruct (pid_t);

/* Markiert einen Task zur Löschung
 * Parameter: PID, Rückgabewert der main() Funktion
 * RÜckgaben: Keine
 */
void DestroyTask (pid_t, int);

/* Löscht einen Task aus der Liste
 * Parameter: Task Struktur
 * Rückgaben: Keine
 */
void RemoveTask (volatile struct task *);

/* Setzt die Argumenteliste (argc, argv)
 * Parameter: PID, Anzahl der Argumente, Argumentliste
 * Rückgaben: Keine
 */
void SetArgumentList (pid_t, int, char **);

/* Gibt die Argumenteliste zurück (argc, argv)
 * Parameter: PID, Anzahl der Argumente (Zeiger)
 * Rückgaben: Keine
 */
char **GetArgumentList (pid_t, int *);

#endif
